package coder.user.controller;

import coder.common.BaseContext;
import coder.common.Result;
import coder.user.dto.UserDto;
import coder.user.entity.User;

import coder.user.service.IUserService;
import coder.utils.RedisUtils;
import coder.utils.UploadUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


@RestController
@Slf4j
@RequestMapping("user")
public class UserController {

    @Autowired
    private IUserService userService;

    @Autowired
    private UploadUtils uploadUtils;

    /**
     * 处理用户注册请求
     *
     * @param user 用户对象，包含用户注册所需的信息
     * @return 返回注册结果，如果注册成功，则返回成功信息
     */
    @RequestMapping("register")
    public Result<String> register(@ModelAttribute User user){
        log.info("用户注册：" + user);
        // 调用用户服务的保存方法，将用户信息保存到数据库
        userService.saveUser(user);
        // 返回注册成功的结果信息
        return Result.success("注册成功");
    }

    /**
     * 处理用户登录请求
     *
     * 该方法通过POST请求接收用户信息，尝试进行用户登录操作
     * 使用ModelAttribute注解将请求体中的用户信息绑定到User对象
     *
     * @param user 用户信息对象，包含登录所需的用户名和密码
     * @return 返回登录结果，包含用户数据
     */
    @PostMapping("login")
    public Result<UserDto> login(@ModelAttribute User user) {
        // 记录用户登录信息，用于调试和审计目的
        log.info("用户登录：" + user);

        // 调用服务层的login方法处理用户登录，并返回登录结果
        return Result.success(userService.login(user));
    }

    /**
     * 处理用户信息更新请求
     *
     * @param user 用户信息对象，包含需要更新的用户数据
     * @return 返回一个Result对象，表示更新操作的结果
     */
    @PostMapping("update")
    public Result<String> update(@ModelAttribute User user){
        // 记录用户更新操作的日志
        log.info("用户更新：" + user);

        // 调用用户服务中的更新方法，执行用户信息的更新操作
        userService.updateUser(user);

        // 返回更新成功的响应结果
        return Result.success("更新成功");
    }

    /**
     * 修改用户密码的接口
     * <p>
     * 本接口接收用户ID、旧密码和新密码作为参数，用于修改用户的密码
     * 主要用于用户在知道当前密码的情况下，想要更新其密码以提高账户安全性
     *
     * @param id 用户ID，用于定位需要修改密码的用户
     * @param oldPwd 旧密码，用于验证用户身份
     * @param newPwd 新密码，用户希望设置的新密码
     * @return 返回一个Result对象，包含操作结果信息
     */
    @PostMapping("changePwd")
    public Result<String> changePwd(@RequestParam String id, @RequestParam String oldPwd, @RequestParam String newPwd) {
        // 调用用户服务中的修改密码方法
        userService.changeUserPwd(id, oldPwd, newPwd);
        // 返回密码修改成功的响应
        return Result.success("密码修改成功");
    }

    @RequestMapping("queryOne")
    public Result<User> queryOne(String username){
        return Result.success(userService.queryOne(username));
    }

    @PostMapping("upload")
    public Result<String> uploadImage(MultipartFile file, @ModelAttribute User user){
        String fileName = uploadUtils.upload(file,"avatar");
        user.setAvatar(fileName);
        user.setId(BaseContext.getCurrentId());
        userService.updateUser(user);
    	return Result.success(fileName);
    }
}
